package com.project.springboot.utils;

import java.lang.reflect.Field;

/**
 * description: 实体对象属性重置工具类
 * @author 朱正磊
 * @date 2024-06-25 09:51:57
 */
public class ResetUtil {

    /**
     * 提醒：这个实现是假设所有非基本类型属性都被初始化为null，并且没有考虑到泛型和包装类型的特殊情况。
     * description: 重置实体对象的属性到它们的初始化状态
     * @author 朱正磊
     * @date 2024-06-25 09:54:06
     * @param t 实体对象
     * @param <T> 泛型
     */
    public static <T> void reset(T t) {
        try {
            for (Field field : t.getClass().getDeclaredFields()) {
                // 取消修饰符对外界的限制，设置属性对象为可访问
                field.setAccessible(true);
                if (field.getType().isPrimitive()) {
                    // 基本类型默认值
                    if (field.getType() == int.class) {
                        field.set(t, 0);
                    } else if (field.getType() == boolean.class) {
                        field.set(t, false);
                    } else if (field.getType() == double.class) {
                        field.set(t, 0.0);
                    } else if (field.getType() == long.class) {
                        field.set(t, 0L);
                    } else if (field.getType() == float.class) {
                        field.set(t, 0.0f);
                    } else if (field.getType() == byte.class) {
                        field.set(t, (byte) 0);
                    } else if (field.getType() == short.class) {
                        field.set(t, (short) 0);
                    } else if (field.getType() == char.class) {
                        field.set(t, '\u0000');
                    }
                } else {
                    // 非基本类型默认实例为null
                    field.set(t, null);
                }
            }
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

}
